{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "07114600-eab8-4036-bdd4-08fd7ae2fbd0",
   "metadata": {},
   "source": [
    "<center><h1><a href=\"https://challenge.xfyun.cn/topic/info?type=mental-health&ch=dw24_AtTCK9\">心理健康辅助诊断挑战赛</a></h1></center>\n",
    "\n",
    "# 一、赛事背景\n",
    "\n",
    "随着社会发展和人们精神需求的提升，心理健康问题越来越受到关注，解决这一问题首先要了解研究对象心理健康的真实状况，即通过便捷高效、低成本的方式尽可能准确地识别研究对象真实的心理健康水平，对异常个体及时发出预警，辅助后续的诊断和干预。\n",
    "\n",
    "得益于穿戴式设备的发展和普及，人们开始可以低成本地记录日常生活中个体特异的外在特征（例如行为活动、生理反应等），以服务于后续的分析和识别，相较于传统的问卷量表测量法，基于穿戴式生理信号的个体心理健康测评方法有望实现低成本、大样本、自动化，并且其具有客观、稳定、不易伪造的优点，在心理健康筛查、临床辅助诊断等领域拥有广阔的应用场景。\n",
    "\n",
    "# 二、赛事任务\n",
    "\n",
    "本赛题提供了对临床抑郁障碍患者和普通人两种人群的日常腕表测量数据。参赛选手需要根据所提供样本构建模型，识别出具有临床抑郁障碍表现的个体。\n",
    "\n",
    "# 三、赛题提供方\n",
    "\n",
    "清华大学心理与认知科学系张丹课题组\n",
    "\n",
    "北京大学回龙观医院临床医学院谭淑平课题组\n",
    "\n",
    "北京汇心健康科技有限公司\n",
    "\n",
    "# 四、评审规则\n",
    "\n",
    "## 1.数据说明\n",
    "\n",
    "本数据共包含54名参与者的日常生理信号，实验对象为18~30岁之间的成年人，男女性别比例为23：31，参与者佩戴腕表采集记录时段为早上6点至下午5点，本数据已进行初步处理删去实验时段以外的数据。所有数据被划分为训练数据和测试数据，训练数据包含抑郁患者与普通人两类人群各20人，总计40人；测试数据包含两类人群各7人，总计14人。分别在日常生活中佩戴穿戴式腕表，记录其真实生活体验带来的生理变化。需要参赛选手在特征提取和模型构建上挖掘训练数据特征，实现对测试数据个体抑郁状况的有效判断。\n",
    "\n",
    "每个个体的测量数据文件为MATLAB格式文件和csv文件（数据相同），数据结构体中包括以下几部分内容，每项子内容中均含有时间标签，可在MATLAB平台或用python读取csv文件查看：\n",
    "\n",
    "| 变量名 | PPG    | ACC        | GSR         |\n",
    "| ------ | ------ | ---------- | ----------- |\n",
    "| 含义   | 脉搏波 | 三轴加速度 | 皮肤电导    |\n",
    "| 采样率 | 20Hz   | 20Hz       | 40Hz        |\n",
    "| 单位   | ——     | m/s2       | S(微西门子) |\n",
    "\n",
    "其中GSR显示为0.0061为缺失值，表示实验对象未正确采集数据\n",
    "\n",
    "## 2.评估指标\n",
    "\n",
    "本模型依据提交的结果文件，采用准确率![img](https://openres.xfyun.cn/xfyundoc/2024-06-04/deb0b456-f1e0-491b-aaf3-2cac29637964/1717490038783/86.png)进行评价排名，如有并列情况按提交顺序排名，先提交者排在前位。\n",
    "\n",
    "## 3. 腕表测量情况简介\n",
    "\n",
    "腕表佩戴开机后持续发送532nm波长的绿光并测量反射光强度，心率（HR）是通过光电容积脉搏波法（PPG）测量得到。在腕表内侧装有电极，通过导电胶接触皮肤表面测量GSR。此外，腕表内置加速度计记录三轴加速度，精度为1/2048g（重力加速度单位）。\n",
    "\n",
    "# 五、作品提交要求\n",
    "\n",
    "1、文件格式：csv\n",
    "\n",
    "2、文件大小：无要求\n",
    "\n",
    "3、文件详细说明：编码为UTF-8，提交格式见样例\n",
    "\n",
    "# 六、赛程规则\n",
    "\n",
    "本赛题实行一轮赛制\n",
    "\n",
    "## 【赛程周期】\n",
    "\n",
    "6月9日-7月9日\n",
    "\n",
    "1、6月9日10：00发布数据集（即开启比赛榜单）\n",
    "\n",
    "2、比赛作品提交截止日期为7月9日17：00，公布名次日期为7月12日10：00\n",
    "\n",
    "## 【现场答辩】\n",
    "\n",
    "1、最终前三名团队将受邀参加科大讯飞AI开发者大赛总决赛并于现场进行答辩\n",
    "\n",
    "2、答辩以（10mins陈述+5mins问答）的形式进行\n",
    "\n",
    "3、根据作品成绩和答辩成绩综合评分（作品成绩占比70％，现场答辩分数占比30％）\n",
    "\n",
    "# 六、奖项设置\n",
    "\n",
    "本赛题设立一、二、三等奖共三名，具体详情如下：\n",
    "\n",
    "## 【奖项激励】\n",
    "\n",
    "1.  TOP3团队颁发获奖证书\n",
    "2.  赛道奖金，第一名5000元、第二名3000元、第三名2000元\n",
    "\n",
    "## 【资源激励】\n",
    "\n",
    "1.  讯飞开放平台优质AI能力个人资源包\n",
    "2.  讯飞AI全链创业扶持资源\n",
    "3.  讯飞绿色实习/就业通道\n",
    "\n",
    "注：\n",
    "\n",
    "1.  鼓励选手分享参赛心得、参赛技术攻略、大赛相关技术或产品使用体验等文章至组委会邮箱（AICompetition@iflytek.com），有机会获得大赛周边；\n",
    "2.  赛事规则及奖金发放解释权归科大讯飞所有；以上全部奖金均为税前金额，将由主办方代扣代缴个人所得税。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "id": "31ff58ff-a8f2-4b3e-81e3-59a808561a8c",
   "metadata": {},
   "outputs": [],
   "source": [
    "# python3 机器学习 + 人工特征\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import glob\n",
    "import os\n",
    "from sklearn.model_selection import cross_val_predict\n",
    "from sklearn.metrics import f1_score\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from lightgbm import LGBMClassifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "id": "128d5ac9-b94f-4fc3-811c-370038c8a1b4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>文件名</th>\n",
       "      <th>是否抑郁(0:无/1:有)</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>data0278</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>data0596</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>data1011</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>data1269</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>data1418</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>data1604</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>data1719</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>data1966</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>data2551</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>data3083</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>data3571</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>data4072</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>data4217</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>data4352</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>data4853</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>data4929</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>data4972</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>data4983</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>data5108</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>data5127</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>data5428</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>data5751</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>data5929</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>data6323</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>data6557</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>data6787</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>data7572</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>data7577</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>data8002</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>data8147</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>data8491</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>data8526</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>data8584</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>data8909</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>data9133</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>data9157</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>data9575</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>data9594</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>data9648</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>39</th>\n",
       "      <td>data9908</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         文件名  是否抑郁(0:无/1:有)\n",
       "0   data0278              1\n",
       "1   data0596              0\n",
       "2   data1011              1\n",
       "3   data1269              1\n",
       "4   data1418              1\n",
       "5   data1604              0\n",
       "6   data1719              0\n",
       "7   data1966              0\n",
       "8   data2551              0\n",
       "9   data3083              0\n",
       "10  data3571              1\n",
       "11  data4072              0\n",
       "12  data4217              1\n",
       "13  data4352              0\n",
       "14  data4853              1\n",
       "15  data4929              0\n",
       "16  data4972              0\n",
       "17  data4983              1\n",
       "18  data5108              0\n",
       "19  data5127              0\n",
       "20  data5428              0\n",
       "21  data5751              0\n",
       "22  data5929              0\n",
       "23  data6323              1\n",
       "24  data6557              1\n",
       "25  data6787              1\n",
       "26  data7572              0\n",
       "27  data7577              1\n",
       "28  data8002              1\n",
       "29  data8147              1\n",
       "30  data8491              1\n",
       "31  data8526              0\n",
       "32  data8584              0\n",
       "33  data8909              0\n",
       "34  data9133              1\n",
       "35  data9157              1\n",
       "36  data9575              1\n",
       "37  data9594              1\n",
       "38  data9648              1\n",
       "39  data9908              0"
      ]
     },
     "execution_count": 129,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取训练集标签\n",
    "train_label = pd.read_csv('training_data/train_label.csv', encoding='gb2312')\n",
    "train_label"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "id": "dbcae729-c6ef-4cbb-8c77-b9d1d5438e49",
   "metadata": {},
   "outputs": [],
   "source": [
    "def manual_feature(df):\n",
    "    feat = [\n",
    "        df_batch['Motion_dataX'].mean(),\n",
    "        df_batch['Motion_dataX'].max(),\n",
    "        df_batch['Motion_dataX'].min(),\n",
    "        df_batch['Motion_dataX'].max() - df_batch['Motion_dataX'].min(),\n",
    "        df_batch['Motion_dataX'].diff(1).mean(),\n",
    "        df_batch['Motion_dataX'].diff(1).max(),\n",
    "        df_batch['Motion_dataX'].diff(1).min(),\n",
    "\n",
    "        df_batch['Motion_dataY'].mean(),\n",
    "        df_batch['Motion_dataY'].max(),\n",
    "        df_batch['Motion_dataY'].min(),\n",
    "        df_batch['Motion_dataY'].max() - df_batch['Motion_dataY'].min(),\n",
    "        df_batch['Motion_dataY'].diff(1).mean(),\n",
    "        df_batch['Motion_dataY'].diff(1).max(),\n",
    "        df_batch['Motion_dataY'].diff(1).min(),\n",
    "\n",
    "        df_batch['Motion_dataZ'].mean(),\n",
    "        df_batch['Motion_dataZ'].max(),\n",
    "        df_batch['Motion_dataZ'].min(),\n",
    "        df_batch['Motion_dataZ'].max() - df_batch['Motion_dataZ'].min(),\n",
    "        df_batch['Motion_dataZ'].diff(1).mean(),\n",
    "        df_batch['Motion_dataZ'].diff(1).max(),\n",
    "        df_batch['Motion_dataZ'].diff(1).min(),\n",
    "\n",
    "        df_batch['GSR'].mean(),\n",
    "        df_batch['GSR'].max(),\n",
    "        df_batch['GSR'].min(),\n",
    "        df_batch['GSR'].max() - df_batch['GSR'].min(),\n",
    "        df_batch['GSR'].diff(1).mean(),\n",
    "        df_batch['GSR'].diff(1).max(),\n",
    "        df_batch['GSR'].diff(1).min(),\n",
    "        df_batch['GSR'].isnull().mean(),\n",
    "\n",
    "        df_batch['PPG'].mean(),\n",
    "        df_batch['PPG'].max(),\n",
    "        df_batch['PPG'].min(),\n",
    "        df_batch['PPG'].max() - df_batch['PPG'].min(),\n",
    "        df_batch['PPG'].diff(1).mean(),\n",
    "        df_batch['PPG'].diff(1).max(),\n",
    "        df_batch['PPG'].diff(1).min(),\n",
    "    ]\n",
    "    return feat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bba02f66-428e-4f9a-be5f-d2615ccce2e3",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "id": "d4b7ed0e-0336-4f73-a563-aeebbc6a6b61",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "data6787 06:00:00 16:59:59\n",
      "data0596 06:00:00 16:59:59\n",
      "data4929 09:07:51 16:59:59\n",
      "data9133 06:00:00 16:59:59\n",
      "data2551 09:56:14 16:59:59\n",
      "data9157 06:00:00 16:59:59\n",
      "data3083 06:00:00 16:59:59\n",
      "data8147 06:00:00 16:59:59\n",
      "data9908 06:00:00 16:59:59\n",
      "data3571 06:00:00 16:59:59\n",
      "data8526 06:00:00 16:59:59\n",
      "data4217 06:00:00 16:59:59\n",
      "data6557 06:00:00 15:43:05\n",
      "data8002 06:00:00 16:59:59\n",
      "data4983 06:00:00 16:59:59\n",
      "data5108 08:25:53 16:59:59\n",
      "data8909 10:29:02 16:59:59\n",
      "data1011 06:00:00 16:59:59\n",
      "data6323 06:00:00 16:59:59\n",
      "data1966 06:00:00 16:59:59\n",
      "data9594 06:00:00 16:59:59\n",
      "data9575 06:00:00 16:59:59\n",
      "data9648 06:00:00 16:59:59\n",
      "data5428 09:00:49 16:59:59\n",
      "data8491 06:00:00 16:59:59\n",
      "data1269 06:00:00 16:59:59\n",
      "data5929 06:00:00 16:59:59\n",
      "data1604 06:00:00 16:59:59\n",
      "data5751 08:50:36 16:59:59\n",
      "data0278 06:00:00 16:59:59\n",
      "data1418 06:00:00 14:46:01\n",
      "data4072 08:19:32 16:59:59\n",
      "data1719 06:00:00 16:59:59\n",
      "data4972 06:00:00 16:59:59\n",
      "data4853 06:00:00 16:59:59\n",
      "data7577 06:00:00 16:59:59\n",
      "data4352 06:15:29 16:59:59\n",
      "data8584 08:56:47 16:59:59\n",
      "data5127 08:34:50 16:59:59\n",
      "data7572 06:00:00 16:59:59\n"
     ]
    }
   ],
   "source": [
    "train_features = []\n",
    "\n",
    "# 对训练集的个体\n",
    "for sid in os.listdir('./training_data/'):\n",
    "    if '.csv' in sid:\n",
    "        continue\n",
    "\n",
    "    # 三类观测数据\n",
    "    df_acc = pd.read_csv(f'./training_data/{sid}/ACC.csv')\n",
    "    df_gsr = pd.read_csv(f'./training_data/{sid}/GSR.csv')\n",
    "    df_ppg = pd.read_csv(f'./training_data/{sid}/PPG.csv')\n",
    "\n",
    "    # 按照时间顺序，拼接三类观测数据\n",
    "    df = pd.concat([df_acc, df_gsr.iloc[::2, :-1].reset_index(drop=True), df_ppg.iloc[:, :-1]], axis=1)\n",
    "    \n",
    "    df['GSR'] = df['GSR'].round(4)\n",
    "    df['GSR'] = df['GSR'].replace(0.0061, np.nan)\n",
    "    \n",
    "    print(sid, df['recording_time'].min(), df['recording_time'].max())\n",
    "    label = train_label.set_index('文件名').loc[sid].values[0]\n",
    "\n",
    "    # 拆分为更小的数据\n",
    "    for idx in range(df.shape[0] // 10000):\n",
    "        df_batch = df.iloc[idx*10000: (idx+1)*10000]\n",
    "        feat = manual_feature(df_batch)\n",
    "        feat = [sid] + feat + [label]\n",
    "        train_features.append(feat)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "id": "18678436-a279-413f-b7bb-2f1e1054c4ba",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Motion_dataX</th>\n",
       "      <th>Motion_dataY</th>\n",
       "      <th>Motion_dataZ</th>\n",
       "      <th>recording_time</th>\n",
       "      <th>GSR</th>\n",
       "      <th>PPG</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>780000</th>\n",
       "      <td>5.495752</td>\n",
       "      <td>-1.126904</td>\n",
       "      <td>12.338525</td>\n",
       "      <td>16:50:00</td>\n",
       "      <td>0.0070</td>\n",
       "      <td>136.115551</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>780001</th>\n",
       "      <td>3.758740</td>\n",
       "      <td>-1.531250</td>\n",
       "      <td>7.414600</td>\n",
       "      <td>16:50:00</td>\n",
       "      <td>0.0070</td>\n",
       "      <td>136.078596</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>780002</th>\n",
       "      <td>4.060205</td>\n",
       "      <td>-0.839795</td>\n",
       "      <td>7.684961</td>\n",
       "      <td>16:50:00</td>\n",
       "      <td>0.0070</td>\n",
       "      <td>136.059821</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>780003</th>\n",
       "      <td>4.141553</td>\n",
       "      <td>-0.636426</td>\n",
       "      <td>10.333545</td>\n",
       "      <td>16:50:00</td>\n",
       "      <td>0.0070</td>\n",
       "      <td>136.103630</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>780004</th>\n",
       "      <td>4.187012</td>\n",
       "      <td>-0.727344</td>\n",
       "      <td>9.800000</td>\n",
       "      <td>16:50:00</td>\n",
       "      <td>0.0065</td>\n",
       "      <td>136.160851</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>789995</th>\n",
       "      <td>3.931006</td>\n",
       "      <td>-1.169971</td>\n",
       "      <td>9.041553</td>\n",
       "      <td>16:58:19</td>\n",
       "      <td>0.0065</td>\n",
       "      <td>136.872530</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>789996</th>\n",
       "      <td>4.158301</td>\n",
       "      <td>-1.485791</td>\n",
       "      <td>8.706592</td>\n",
       "      <td>16:58:19</td>\n",
       "      <td>0.0065</td>\n",
       "      <td>136.872530</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>789997</th>\n",
       "      <td>3.665430</td>\n",
       "      <td>-1.504932</td>\n",
       "      <td>8.694629</td>\n",
       "      <td>16:58:19</td>\n",
       "      <td>0.0065</td>\n",
       "      <td>136.872530</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>789998</th>\n",
       "      <td>3.866406</td>\n",
       "      <td>-1.363770</td>\n",
       "      <td>7.895508</td>\n",
       "      <td>16:58:19</td>\n",
       "      <td>0.0065</td>\n",
       "      <td>136.872530</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>789999</th>\n",
       "      <td>3.746777</td>\n",
       "      <td>-1.440332</td>\n",
       "      <td>9.359766</td>\n",
       "      <td>16:58:19</td>\n",
       "      <td>0.0065</td>\n",
       "      <td>136.872530</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>10000 rows × 6 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        Motion_dataX  Motion_dataY  Motion_dataZ recording_time     GSR  \\\n",
       "780000      5.495752     -1.126904     12.338525       16:50:00  0.0070   \n",
       "780001      3.758740     -1.531250      7.414600       16:50:00  0.0070   \n",
       "780002      4.060205     -0.839795      7.684961       16:50:00  0.0070   \n",
       "780003      4.141553     -0.636426     10.333545       16:50:00  0.0070   \n",
       "780004      4.187012     -0.727344      9.800000       16:50:00  0.0065   \n",
       "...              ...           ...           ...            ...     ...   \n",
       "789995      3.931006     -1.169971      9.041553       16:58:19  0.0065   \n",
       "789996      4.158301     -1.485791      8.706592       16:58:19  0.0065   \n",
       "789997      3.665430     -1.504932      8.694629       16:58:19  0.0065   \n",
       "789998      3.866406     -1.363770      7.895508       16:58:19  0.0065   \n",
       "789999      3.746777     -1.440332      9.359766       16:58:19  0.0065   \n",
       "\n",
       "               PPG  \n",
       "780000  136.115551  \n",
       "780001  136.078596  \n",
       "780002  136.059821  \n",
       "780003  136.103630  \n",
       "780004  136.160851  \n",
       "...            ...  \n",
       "789995  136.872530  \n",
       "789996  136.872530  \n",
       "789997  136.872530  \n",
       "789998  136.872530  \n",
       "789999  136.872530  \n",
       "\n",
       "[10000 rows x 6 columns]"
      ]
     },
     "execution_count": 130,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_batch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "id": "fddd4400-1ce0-4fad-8bdf-42af63906322",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Motion_dataX</th>\n",
       "      <th>Motion_dataY</th>\n",
       "      <th>Motion_dataZ</th>\n",
       "      <th>recording_time</th>\n",
       "      <th>GSR</th>\n",
       "      <th>PPG</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.014453</td>\n",
       "      <td>-0.866113</td>\n",
       "      <td>-9.955518</td>\n",
       "      <td>06:00:00</td>\n",
       "      <td>0.0115</td>\n",
       "      <td>116.709471</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.004883</td>\n",
       "      <td>-0.890039</td>\n",
       "      <td>-9.974658</td>\n",
       "      <td>06:00:00</td>\n",
       "      <td>0.0115</td>\n",
       "      <td>116.709471</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.031201</td>\n",
       "      <td>-0.835010</td>\n",
       "      <td>-9.974658</td>\n",
       "      <td>06:00:00</td>\n",
       "      <td>0.0115</td>\n",
       "      <td>116.709471</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.047949</td>\n",
       "      <td>-0.858936</td>\n",
       "      <td>-9.972266</td>\n",
       "      <td>06:00:00</td>\n",
       "      <td>0.0115</td>\n",
       "      <td>116.709471</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.033594</td>\n",
       "      <td>-0.858936</td>\n",
       "      <td>-10.005762</td>\n",
       "      <td>06:00:00</td>\n",
       "      <td>0.0110</td>\n",
       "      <td>116.709471</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>791995</th>\n",
       "      <td>3.868799</td>\n",
       "      <td>-1.445117</td>\n",
       "      <td>8.816650</td>\n",
       "      <td>16:59:59</td>\n",
       "      <td>0.0065</td>\n",
       "      <td>137.294531</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>791996</th>\n",
       "      <td>3.892725</td>\n",
       "      <td>-1.457080</td>\n",
       "      <td>8.816650</td>\n",
       "      <td>16:59:59</td>\n",
       "      <td>NaN</td>\n",
       "      <td>137.294531</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>791997</th>\n",
       "      <td>3.864014</td>\n",
       "      <td>-1.435547</td>\n",
       "      <td>8.795117</td>\n",
       "      <td>16:59:59</td>\n",
       "      <td>0.0070</td>\n",
       "      <td>137.294531</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>791998</th>\n",
       "      <td>3.847266</td>\n",
       "      <td>-1.430762</td>\n",
       "      <td>8.823828</td>\n",
       "      <td>16:59:59</td>\n",
       "      <td>0.0070</td>\n",
       "      <td>137.294531</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>791999</th>\n",
       "      <td>3.878369</td>\n",
       "      <td>-1.421191</td>\n",
       "      <td>8.857324</td>\n",
       "      <td>16:59:59</td>\n",
       "      <td>0.0065</td>\n",
       "      <td>137.294531</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>792000 rows × 6 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        Motion_dataX  Motion_dataY  Motion_dataZ recording_time     GSR  \\\n",
       "0           1.014453     -0.866113     -9.955518       06:00:00  0.0115   \n",
       "1           1.004883     -0.890039     -9.974658       06:00:00  0.0115   \n",
       "2           1.031201     -0.835010     -9.974658       06:00:00  0.0115   \n",
       "3           1.047949     -0.858936     -9.972266       06:00:00  0.0115   \n",
       "4           1.033594     -0.858936    -10.005762       06:00:00  0.0110   \n",
       "...              ...           ...           ...            ...     ...   \n",
       "791995      3.868799     -1.445117      8.816650       16:59:59  0.0065   \n",
       "791996      3.892725     -1.457080      8.816650       16:59:59     NaN   \n",
       "791997      3.864014     -1.435547      8.795117       16:59:59  0.0070   \n",
       "791998      3.847266     -1.430762      8.823828       16:59:59  0.0070   \n",
       "791999      3.878369     -1.421191      8.857324       16:59:59  0.0065   \n",
       "\n",
       "               PPG  \n",
       "0       116.709471  \n",
       "1       116.709471  \n",
       "2       116.709471  \n",
       "3       116.709471  \n",
       "4       116.709471  \n",
       "...            ...  \n",
       "791995  137.294531  \n",
       "791996  137.294531  \n",
       "791997  137.294531  \n",
       "791998  137.294531  \n",
       "791999  137.294531  \n",
       "\n",
       "[792000 rows x 6 columns]"
      ]
     },
     "execution_count": 128,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "id": "f9b88ce8-812f-4a76-82fc-c771886b034c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "data0856 06:00:00 16:59:59\n",
      "data0562 09:11:31 16:59:59\n",
      "data0461 06:00:00 16:59:59\n",
      "data1576 06:00:00 16:59:59\n",
      "data0129 06:00:00 16:59:59\n",
      "data0699 06:00:00 16:59:59\n",
      "data5166 08:11:03 16:59:59\n",
      "data9057 06:00:00 16:59:59\n",
      "data0702 06:00:00 16:59:59\n",
      "data0671 10:01:30 16:59:59\n",
      "data0999 06:00:00 16:59:59\n",
      "data3862 06:00:00 16:59:59\n",
      "data0882 09:41:24 16:59:59\n",
      "data0984 06:00:00 16:59:59\n",
      "data0172 10:43:28 16:59:59\n",
      "data0548 06:00:00 16:59:59\n",
      "data0369 09:10:05 16:59:59\n",
      "data0157 10:23:05 16:59:59\n",
      "data4722 08:58:50 16:18:37\n",
      "data5468 06:00:00 16:59:59\n",
      "data0645 07:19:29 16:59:59\n",
      "data0667 06:00:00 16:59:59\n",
      "data4998 09:26:17 16:59:59\n",
      "data0377 08:38:51 16:59:59\n",
      "data0541 06:00:00 16:59:59\n",
      "data0943 06:00:00 16:24:55\n",
      "data1428 06:00:00 16:59:59\n",
      "data0191 08:23:27 16:59:59\n",
      "data7329 07:34:22 16:59:59\n",
      "data0033 09:41:01 16:59:59\n",
      "data0982 11:10:27 16:59:59\n",
      "data7431 06:00:00 16:59:59\n",
      "data0302 06:00:00 16:59:59\n",
      "data0418 06:00:00 16:59:59\n",
      "data9339 06:00:00 16:59:59\n",
      "data9597 06:00:00 16:59:59\n",
      "data2381 06:00:00 16:59:59\n",
      "data0975 06:00:00 16:59:59\n",
      "data0179 06:00:00 16:59:59\n"
     ]
    }
   ],
   "source": [
    "test_features = []\n",
    "for sid in os.listdir('./test_data/'):\n",
    "    if '.csv' in sid:\n",
    "        continue\n",
    "\n",
    "    df_acc = pd.read_csv(f'./test_data/{sid}/ACC.csv')\n",
    "    df_gsr = pd.read_csv(f'./test_data/{sid}/GSR.csv')\n",
    "    df_ppg = pd.read_csv(f'./test_data/{sid}/PPG.csv')\n",
    "    df = pd.concat([df_acc, df_gsr.iloc[::2, :-1].reset_index(drop=True), df_ppg.iloc[:, :-1]], axis=1)\n",
    "    \n",
    "    df['GSR'] = df['GSR'].round(4)\n",
    "    df['GSR'] = df['GSR'].replace(0.0061, np.nan)\n",
    "    \n",
    "    print(sid, df['recording_time'].min(), df['recording_time'].max())\n",
    "    for idx in range(df.shape[0] // 10000):\n",
    "        df_batch = df.iloc[idx*10000: (idx+1)*10000]\n",
    "        feat = manual_feature(df_batch)\n",
    "        feat = [sid] + feat\n",
    "        test_features.append(feat)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "id": "f5d9cd8a-1226-4bff-90be-5be5eaee9bc8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: xlabel='recording_time'>"
      ]
     },
     "execution_count": 124,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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zs7OWrtm1+Qc09PT2aVLl9iBAwcYABYREcEuXbrEkpOT+Xwrfm5+/vlntnPnThYfH89u377Ndu7cyTw8PNjo0aP5NF988QX7+++/2e3bt1l8fDxbsWIFE4lEar3dKp5jXFwcc3Z2ZmPGjFF7r5YfeqDiOX799df8OVY8v5KSEvbKK6+wpk2bssuXL6vlWb63TcXX8Ntvv2V79+5liYmJLC4ujk2fPp0JBAK1XoMN6X1akbbeTPq6LhjqmioSidiuXbu0nmNubi77+OOPWXR0NLt79y47cuQICwgIYL6+vmpDetTmejNv3jx28uRJdvfuXXb16lU2b948xnEc+/vvvys9x2PHjjELCwsWFham9tylp6dXeY7UNdsErV69mnl5eTGJRMK6du3Kzp49q7Z96dKlrGnTpszCwoIFBgayf/75R217nz59WEhIiNq648ePs06dOjGJRMJatGjBtmzZUuPjhoSEsD59+qitu3LlCuvVqxeTSqWsSZMmbNmyZRr5/vrrr+yFF15gEomEtW3blh04cKDaY4WFhTFPT0+1sSnK8/b2Zp999pnaMgCNR2mawsJCNnLkSObh4cEkEglzd3dnr7zyCjt37lyVz12fPn205lvx+dV2PlWd47///stee+015uLiwiwsLFiHDh00umprex3Lq6yr5J9//snatWvHpFIpa926NduwYYPGft7e3pXmW1nX2orvoblz51b53CiVSvbpp58yV1dXJpVK2YABA1hCQkK156gtz4rl1faequ4c7927x4YOHcrMzc2Zk5MTmzVrFpPJZHU6xy1btlT5vmNM83MTERHBAgICmJWVFbO0tGRt2rRhX3zxhVqQ93//93/Mx8eHmZmZMXt7exYYGMgiIiKqPMfPPvtMp+eu/Dm6u7tXen6l3c21PY4fP17pa/jll1+yli1bMjMzM+bg4MD69u3Ljh07xipqKO/TirQFM/q8LpSnr2vq0qVLKy1PQUEBGzx4MHN2dmZisZh5e3uziRMnqgVV2s6xIm3Xm/fee495e3sziUTCnJ2d2YABA9QCGW3nGBISorWsFZ+H6j7jjRHNmk0IIYQQk9Zo2swQQggh5PlEwQwhhBBCTBoFM4QQQggxaRTMEEIIIcSkUTBDCCGEEJNGwQwhhBBCTBoFM4QQQggxaRTMEEIIIcSkUTBDCGlw7t27B47jcPnyZQCq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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df.set_index('recording_time').plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "id": "5f0deb8e-6567-49dd-8aa0-bc87beb01672",
   "metadata": {},
   "outputs": [],
   "source": [
    "train_features = pd.DataFrame(train_features)\n",
    "test_features = pd.DataFrame(test_features)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "id": "0579df95-40fa-473b-997c-794c9522692d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>...</th>\n",
       "      <th>28</th>\n",
       "      <th>29</th>\n",
       "      <th>30</th>\n",
       "      <th>31</th>\n",
       "      <th>32</th>\n",
       "      <th>33</th>\n",
       "      <th>34</th>\n",
       "      <th>35</th>\n",
       "      <th>36</th>\n",
       "      <th>37</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>data6787</td>\n",
       "      <td>6.458155</td>\n",
       "      <td>12.183008</td>\n",
       "      <td>-3.533838</td>\n",
       "      <td>15.716846</td>\n",
       "      <td>0.000037</td>\n",
       "      <td>6.778174</td>\n",
       "      <td>-5.560352</td>\n",
       "      <td>-2.107983</td>\n",
       "      <td>12.570605</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.0489</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.460892</td>\n",
       "      <td>0.610352</td>\n",
       "      <td>0.391006</td>\n",
       "      <td>0.219345</td>\n",
       "      <td>-0.000002</td>\n",
       "      <td>0.071526</td>\n",
       "      <td>-0.065565</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>data6787</td>\n",
       "      <td>3.351987</td>\n",
       "      <td>24.571777</td>\n",
       "      <td>-11.278613</td>\n",
       "      <td>35.850391</td>\n",
       "      <td>-0.000816</td>\n",
       "      <td>14.963184</td>\n",
       "      <td>-28.782715</td>\n",
       "      <td>2.127313</td>\n",
       "      <td>22.526123</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.0538</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.498489</td>\n",
       "      <td>0.610352</td>\n",
       "      <td>0.390112</td>\n",
       "      <td>0.220239</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.071526</td>\n",
       "      <td>-0.065565</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>data6787</td>\n",
       "      <td>-1.592960</td>\n",
       "      <td>4.158301</td>\n",
       "      <td>-1.753760</td>\n",
       "      <td>5.912061</td>\n",
       "      <td>0.000010</td>\n",
       "      <td>3.320898</td>\n",
       "      <td>-1.631738</td>\n",
       "      <td>7.598320</td>\n",
       "      <td>9.237744</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.0181</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.468828</td>\n",
       "      <td>0.610352</td>\n",
       "      <td>0.390112</td>\n",
       "      <td>0.220239</td>\n",
       "      <td>0.000002</td>\n",
       "      <td>0.071526</td>\n",
       "      <td>-0.065565</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>data6787</td>\n",
       "      <td>0.979819</td>\n",
       "      <td>21.432715</td>\n",
       "      <td>-32.407471</td>\n",
       "      <td>53.840186</td>\n",
       "      <td>0.001060</td>\n",
       "      <td>41.061426</td>\n",
       "      <td>-32.345264</td>\n",
       "      <td>3.004144</td>\n",
       "      <td>40.118750</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.0469</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.468561</td>\n",
       "      <td>0.610352</td>\n",
       "      <td>0.391006</td>\n",
       "      <td>0.219345</td>\n",
       "      <td>0.000018</td>\n",
       "      <td>0.071526</td>\n",
       "      <td>-0.065565</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>data6787</td>\n",
       "      <td>-3.194849</td>\n",
       "      <td>24.724902</td>\n",
       "      <td>-26.454736</td>\n",
       "      <td>51.179639</td>\n",
       "      <td>-0.000430</td>\n",
       "      <td>22.779736</td>\n",
       "      <td>-18.879834</td>\n",
       "      <td>-5.450964</td>\n",
       "      <td>21.765283</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.0675</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.464485</td>\n",
       "      <td>0.610352</td>\n",
       "      <td>0.398457</td>\n",
       "      <td>0.211895</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.065565</td>\n",
       "      <td>-0.065565</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2866</th>\n",
       "      <td>data7572</td>\n",
       "      <td>-1.613001</td>\n",
       "      <td>4.710986</td>\n",
       "      <td>-11.946143</td>\n",
       "      <td>16.657129</td>\n",
       "      <td>0.000127</td>\n",
       "      <td>6.184814</td>\n",
       "      <td>-5.589062</td>\n",
       "      <td>5.892832</td>\n",
       "      <td>18.784131</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.0300</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>47.790779</td>\n",
       "      <td>62.781274</td>\n",
       "      <td>41.992068</td>\n",
       "      <td>20.789206</td>\n",
       "      <td>-0.000854</td>\n",
       "      <td>2.166927</td>\n",
       "      <td>-2.043545</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2867</th>\n",
       "      <td>data7572</td>\n",
       "      <td>-1.882508</td>\n",
       "      <td>5.067480</td>\n",
       "      <td>-12.692627</td>\n",
       "      <td>17.760107</td>\n",
       "      <td>-0.000130</td>\n",
       "      <td>10.307227</td>\n",
       "      <td>-9.020020</td>\n",
       "      <td>6.777731</td>\n",
       "      <td>24.346875</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.5259</td>\n",
       "      <td>0.0807</td>\n",
       "      <td>45.701704</td>\n",
       "      <td>71.832538</td>\n",
       "      <td>35.800934</td>\n",
       "      <td>36.031604</td>\n",
       "      <td>-0.000620</td>\n",
       "      <td>2.786815</td>\n",
       "      <td>-2.468526</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2868</th>\n",
       "      <td>data7572</td>\n",
       "      <td>-1.133378</td>\n",
       "      <td>11.754736</td>\n",
       "      <td>-10.512988</td>\n",
       "      <td>22.267725</td>\n",
       "      <td>0.000105</td>\n",
       "      <td>16.683447</td>\n",
       "      <td>-11.929395</td>\n",
       "      <td>6.797256</td>\n",
       "      <td>28.328125</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.1321</td>\n",
       "      <td>0.0745</td>\n",
       "      <td>42.063729</td>\n",
       "      <td>55.252016</td>\n",
       "      <td>35.319626</td>\n",
       "      <td>19.932389</td>\n",
       "      <td>-0.000165</td>\n",
       "      <td>2.184510</td>\n",
       "      <td>-0.984967</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2869</th>\n",
       "      <td>data7572</td>\n",
       "      <td>-2.470743</td>\n",
       "      <td>6.261377</td>\n",
       "      <td>-13.424756</td>\n",
       "      <td>19.686133</td>\n",
       "      <td>-0.000108</td>\n",
       "      <td>6.086719</td>\n",
       "      <td>-5.713477</td>\n",
       "      <td>6.163160</td>\n",
       "      <td>18.635791</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.0757</td>\n",
       "      <td>0.0983</td>\n",
       "      <td>45.652106</td>\n",
       "      <td>68.050027</td>\n",
       "      <td>37.066042</td>\n",
       "      <td>30.983984</td>\n",
       "      <td>0.000208</td>\n",
       "      <td>2.878904</td>\n",
       "      <td>-1.478195</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2870</th>\n",
       "      <td>data7572</td>\n",
       "      <td>-2.167638</td>\n",
       "      <td>15.396240</td>\n",
       "      <td>-10.936475</td>\n",
       "      <td>26.332715</td>\n",
       "      <td>-0.000305</td>\n",
       "      <td>11.218799</td>\n",
       "      <td>-13.003662</td>\n",
       "      <td>6.263293</td>\n",
       "      <td>21.887305</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.0495</td>\n",
       "      <td>0.1285</td>\n",
       "      <td>47.461208</td>\n",
       "      <td>67.619979</td>\n",
       "      <td>35.876036</td>\n",
       "      <td>31.743944</td>\n",
       "      <td>0.001811</td>\n",
       "      <td>2.236068</td>\n",
       "      <td>-2.514720</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2871 rows × 38 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "            0         1          2          3          4         5   \\\n",
       "0     data6787  6.458155  12.183008  -3.533838  15.716846  0.000037   \n",
       "1     data6787  3.351987  24.571777 -11.278613  35.850391 -0.000816   \n",
       "2     data6787 -1.592960   4.158301  -1.753760   5.912061  0.000010   \n",
       "3     data6787  0.979819  21.432715 -32.407471  53.840186  0.001060   \n",
       "4     data6787 -3.194849  24.724902 -26.454736  51.179639 -0.000430   \n",
       "...        ...       ...        ...        ...        ...       ...   \n",
       "2866  data7572 -1.613001   4.710986 -11.946143  16.657129  0.000127   \n",
       "2867  data7572 -1.882508   5.067480 -12.692627  17.760107 -0.000130   \n",
       "2868  data7572 -1.133378  11.754736 -10.512988  22.267725  0.000105   \n",
       "2869  data7572 -2.470743   6.261377 -13.424756  19.686133 -0.000108   \n",
       "2870  data7572 -2.167638  15.396240 -10.936475  26.332715 -0.000305   \n",
       "\n",
       "             6          7         8          9   ...      28      29  \\\n",
       "0      6.778174  -5.560352 -2.107983  12.570605  ... -0.0489  0.0000   \n",
       "1     14.963184 -28.782715  2.127313  22.526123  ... -0.0538  0.0000   \n",
       "2      3.320898  -1.631738  7.598320   9.237744  ... -0.0181  0.0000   \n",
       "3     41.061426 -32.345264  3.004144  40.118750  ... -0.0469  0.0000   \n",
       "4     22.779736 -18.879834 -5.450964  21.765283  ... -0.0675  0.0000   \n",
       "...         ...        ...       ...        ...  ...     ...     ...   \n",
       "2866   6.184814  -5.589062  5.892832  18.784131  ... -0.0300  0.0000   \n",
       "2867  10.307227  -9.020020  6.777731  24.346875  ... -0.5259  0.0807   \n",
       "2868  16.683447 -11.929395  6.797256  28.328125  ... -0.1321  0.0745   \n",
       "2869   6.086719  -5.713477  6.163160  18.635791  ... -0.0757  0.0983   \n",
       "2870  11.218799 -13.003662  6.263293  21.887305  ... -0.0495  0.1285   \n",
       "\n",
       "             30         31         32         33        34        35  \\\n",
       "0      0.460892   0.610352   0.391006   0.219345 -0.000002  0.071526   \n",
       "1      0.498489   0.610352   0.390112   0.220239  0.000000  0.071526   \n",
       "2      0.468828   0.610352   0.390112   0.220239  0.000002  0.071526   \n",
       "3      0.468561   0.610352   0.391006   0.219345  0.000018  0.071526   \n",
       "4      0.464485   0.610352   0.398457   0.211895  0.000000  0.065565   \n",
       "...         ...        ...        ...        ...       ...       ...   \n",
       "2866  47.790779  62.781274  41.992068  20.789206 -0.000854  2.166927   \n",
       "2867  45.701704  71.832538  35.800934  36.031604 -0.000620  2.786815   \n",
       "2868  42.063729  55.252016  35.319626  19.932389 -0.000165  2.184510   \n",
       "2869  45.652106  68.050027  37.066042  30.983984  0.000208  2.878904   \n",
       "2870  47.461208  67.619979  35.876036  31.743944  0.001811  2.236068   \n",
       "\n",
       "            36  37  \n",
       "0    -0.065565   1  \n",
       "1    -0.065565   1  \n",
       "2    -0.065565   1  \n",
       "3    -0.065565   1  \n",
       "4    -0.065565   1  \n",
       "...        ...  ..  \n",
       "2866 -2.043545   0  \n",
       "2867 -2.468526   0  \n",
       "2868 -0.984967   0  \n",
       "2869 -1.478195   0  \n",
       "2870 -2.514720   0  \n",
       "\n",
       "[2871 rows x 38 columns]"
      ]
     },
     "execution_count": 131,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_features"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "id": "1510cd76-368b-4d16-9a2b-08b52dc3debc",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/lyz/anaconda3/envs/py311/lib/python3.11/site-packages/sklearn/linear_model/_logistic.py:469: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
      "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
      "\n",
      "Increase the number of iterations (max_iter) or scale the data as shown in:\n",
      "    https://scikit-learn.org/stable/modules/preprocessing.html\n",
      "Please also refer to the documentation for alternative solver options:\n",
      "    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n",
      "  n_iter_i = _check_optimize_result(\n",
      "/home/lyz/anaconda3/envs/py311/lib/python3.11/site-packages/sklearn/linear_model/_logistic.py:469: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
      "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
      "\n",
      "Increase the number of iterations (max_iter) or scale the data as shown in:\n",
      "    https://scikit-learn.org/stable/modules/preprocessing.html\n",
      "Please also refer to the documentation for alternative solver options:\n",
      "    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n",
      "  n_iter_i = _check_optimize_result(\n",
      "/home/lyz/anaconda3/envs/py311/lib/python3.11/site-packages/sklearn/linear_model/_logistic.py:469: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
      "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
      "\n",
      "Increase the number of iterations (max_iter) or scale the data as shown in:\n",
      "    https://scikit-learn.org/stable/modules/preprocessing.html\n",
      "Please also refer to the documentation for alternative solver options:\n",
      "    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n",
      "  n_iter_i = _check_optimize_result(\n",
      "/home/lyz/anaconda3/envs/py311/lib/python3.11/site-packages/sklearn/linear_model/_logistic.py:469: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
      "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
      "\n",
      "Increase the number of iterations (max_iter) or scale the data as shown in:\n",
      "    https://scikit-learn.org/stable/modules/preprocessing.html\n",
      "Please also refer to the documentation for alternative solver options:\n",
      "    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n",
      "  n_iter_i = _check_optimize_result(\n",
      "/home/lyz/anaconda3/envs/py311/lib/python3.11/site-packages/sklearn/linear_model/_logistic.py:469: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
      "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
      "\n",
      "Increase the number of iterations (max_iter) or scale the data as shown in:\n",
      "    https://scikit-learn.org/stable/modules/preprocessing.html\n",
      "Please also refer to the documentation for alternative solver options:\n",
      "    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n",
      "  n_iter_i = _check_optimize_result(\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.6277128547579299"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pred = cross_val_predict(\n",
    "    LogisticRegression(max_iter=1000),\n",
    "    train_features.iloc[:, 1:-1].fillna(0),\n",
    "    train_features.iloc[:, -1]\n",
    ")\n",
    "\n",
    "f1_score(train_features.iloc[:, -1], pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "id": "73baf5c6-0c8d-47ea-b8ba-9e1e23f35e9b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6821360457724094"
      ]
     },
     "execution_count": 104,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pred = cross_val_predict(\n",
    "    DecisionTreeClassifier(),\n",
    "    train_features.iloc[:, 1:-1].fillna(0),\n",
    "    train_features.iloc[:, -1]\n",
    ")\n",
    "\n",
    "f1_score(train_features.iloc[:, -1], pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "id": "bd0540f2-434a-4780-a6c7-04b227f8cb41",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[LightGBM] [Info] Number of positive: 1242, number of negative: 1054\n",
      "[LightGBM] [Info] Auto-choosing col-wise multi-threading, the overhead of testing was 0.000382 seconds.\n",
      "You can set `force_col_wise=true` to remove the overhead.\n",
      "[LightGBM] [Info] Total Bins 9168\n",
      "[LightGBM] [Info] Number of data points in the train set: 2296, number of used features: 36\n",
      "[LightGBM] [Info] [binary:BoostFromScore]: pavg=0.540941 -> initscore=0.164131\n",
      "[LightGBM] [Info] Start training from score 0.164131\n",
      "[LightGBM] [Info] Number of positive: 1242, number of negative: 1055\n",
      "[LightGBM] [Info] Auto-choosing col-wise multi-threading, the overhead of testing was 0.000658 seconds.\n",
      "You can set `force_col_wise=true` to remove the overhead.\n",
      "[LightGBM] [Info] Total Bins 9161\n",
      "[LightGBM] [Info] Number of data points in the train set: 2297, number of used features: 36\n",
      "[LightGBM] [Info] [binary:BoostFromScore]: pavg=0.540705 -> initscore=0.163182\n",
      "[LightGBM] [Info] Start training from score 0.163182\n",
      "[LightGBM] [Info] Number of positive: 1242, number of negative: 1055\n",
      "[LightGBM] [Info] Auto-choosing col-wise multi-threading, the overhead of testing was 0.000308 seconds.\n",
      "You can set `force_col_wise=true` to remove the overhead.\n",
      "[LightGBM] [Info] Total Bins 9165\n",
      "[LightGBM] [Info] Number of data points in the train set: 2297, number of used features: 36\n",
      "[LightGBM] [Info] [binary:BoostFromScore]: pavg=0.540705 -> initscore=0.163182\n",
      "[LightGBM] [Info] Start training from score 0.163182\n",
      "[LightGBM] [Info] Number of positive: 1243, number of negative: 1054\n",
      "[LightGBM] [Info] Auto-choosing col-wise multi-threading, the overhead of testing was 0.000304 seconds.\n",
      "You can set `force_col_wise=true` to remove the overhead.\n",
      "[LightGBM] [Info] Total Bins 9166\n",
      "[LightGBM] [Info] Number of data points in the train set: 2297, number of used features: 36\n",
      "[LightGBM] [Info] [binary:BoostFromScore]: pavg=0.541141 -> initscore=0.164935\n",
      "[LightGBM] [Info] Start training from score 0.164935\n",
      "[LightGBM] [Info] Number of positive: 1243, number of negative: 1054\n",
      "[LightGBM] [Info] Auto-choosing col-wise multi-threading, the overhead of testing was 0.000315 seconds.\n",
      "You can set `force_col_wise=true` to remove the overhead.\n",
      "[LightGBM] [Info] Total Bins 9167\n",
      "[LightGBM] [Info] Number of data points in the train set: 2297, number of used features: 36\n",
      "[LightGBM] [Info] [binary:BoostFromScore]: pavg=0.541141 -> initscore=0.164935\n",
      "[LightGBM] [Info] Start training from score 0.164935\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.7565301515640116"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pred = cross_val_predict(\n",
    "    LGBMClassifier(),\n",
    "    train_features.iloc[:, 1:-1],\n",
    "    train_features.iloc[:, -1]\n",
    ")\n",
    "\n",
    "f1_score(train_features.iloc[:, -1], pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "id": "7a8567c0-10cb-4e7b-9a54-92507c312ed9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[LightGBM] [Info] Number of positive: 1553, number of negative: 1318\n",
      "[LightGBM] [Info] Auto-choosing col-wise multi-threading, the overhead of testing was 0.000649 seconds.\n",
      "You can set `force_col_wise=true` to remove the overhead.\n",
      "[LightGBM] [Info] Total Bins 9170\n",
      "[LightGBM] [Info] Number of data points in the train set: 2871, number of used features: 36\n",
      "[LightGBM] [Info] [binary:BoostFromScore]: pavg=0.540927 -> initscore=0.164073\n",
      "[LightGBM] [Info] Start training from score 0.164073\n"
     ]
    }
   ],
   "source": [
    "model = LGBMClassifier()\n",
    "model.fit(train_features.iloc[:, 1:-1], train_features.iloc[:, -1])\n",
    "test_pred = model.predict(test_features.iloc[:, 1:])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "id": "f89c4fcf-9927-4b9a-abba-12e44cc6db4f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 1, ..., 1, 1, 1])"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "id": "8bd5d060-0ebc-47c3-931c-77f461b5a4f5",
   "metadata": {},
   "outputs": [],
   "source": [
    "test_features['label'] = test_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "id": "5b257767-b9db-440a-9a1c-4a328cb9b093",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 测试集包含多个预测\n",
    "pred = test_features.groupby(0)['label'].mean() > 0.5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "id": "817c5499-50a2-41c7-b507-254df81ea147",
   "metadata": {},
   "outputs": [],
   "source": [
    "pred = pred.astype(int).reset_index()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "id": "d77ac943-542c-4579-afc0-bdbfe3eb0272",
   "metadata": {},
   "outputs": [],
   "source": [
    "pred.to_csv('lgb.csv', index=None, header=None)\n",
    "# 初赛：0.82051"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6b793e68-99d9-469d-9a63-e9bb5abce25a",
   "metadata": {},
   "source": [
    "# 七、改进方向\n",
    "\n",
    "\n",
    "1. **增加人工特征：**\n",
    "   - 对数据进行进一步的特征工程处理，增加更多的统计特征（如方差、标准差、偏度、峰度等）。\n",
    "   - 引入频域特征，通过对时间序列信号进行傅里叶变换提取频域特征。\n",
    "   - 针对每个传感器数据，增加滑动窗口的特征（如滑动窗口内的均值、标准差等）。\n",
    "\n",
    "2. **使用深度学习方法：**\n",
    "   - **卷积神经网络（CNN）：** 可以用于提取时序信号中的局部特征，适合处理一维时序数据。\n",
    "   - **循环神经网络（RNN）：** 尤其是LSTM或GRU，可以捕捉时间序列中的长期依赖关系。\n",
    "   - **混合模型：** 将CNN用于提取局部特征，然后将提取的特征输入到LSTM中，以捕捉长期依赖关系。\n",
    "\n",
    "3. **数据预处理和增强：**\n",
    "   - 对数据进行归一化处理，保证各特征具有相同的量纲。\n",
    "   - 增加数据增强手段，如加噪、随机裁剪等，增加数据的多样性，提高模型的鲁棒性。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "960f6c60-01a7-4f0a-8a6e-d5c9f496c2be",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "py3.11",
   "language": "python",
   "name": "py3.11"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
